package com.hgl.bi.common.manager;

import com.hgl.bi.common.constant.ErrorCode;
import com.hgl.bi.common.exception.BusinessException;
import com.wf.captcha.ArithmeticCaptcha;
import com.wf.captcha.ChineseCaptcha;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @program: BI
 * @description: 验证码工具类
 * @author: hgl
 * @create: 2025-02-12 20:40
 */
@Slf4j
@Component
public class CaptchaManager {

    @Autowired
    private RedisManager redisManager;

    /**
     * 生成数字验证码
     * @param key 缓存的key
     * @return 验证码图片的base64编码
     */
    public String getNumberCaptcha(String key) {
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5); // 宽度、高度、字符数
        specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER); // 设置为数字类型
        String code = specCaptcha.text(); // 获取验证码文本
        log.info("验证码: {}", code);
        redisManager.set(key, code, 120); // 将验证码存入Redis，设置过期时间为120秒
        return specCaptcha.toBase64(); // 返回base64格式的图片
    }

    /**
     * 生成字母验证码
     * @param key 缓存的key
     * @return 验证码图片的base64编码
     */
    public String getLetterCaptcha(String key) {
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
        specCaptcha.setCharType(Captcha.TYPE_ONLY_UPPER); // 设置为大写字母类型
        String code = specCaptcha.text();
        log.info("验证码: {}", code);
        redisManager.set(key, code, 120); // 将验证码存入Redis，设置过期时间为120秒
        return specCaptcha.toBase64();
    }

    /**
     * 生成中文验证码
     * @param key 缓存的key
     * @return 验证码图片的base64编码
     */
    public String getChineseCaptcha(String key) {
        ChineseCaptcha chineseCaptcha = new ChineseCaptcha(130, 48);
        String code = chineseCaptcha.text();
        log.info("验证码: {}", code);
        redisManager.set(key, code, 120); // 将验证码存入Redis，设置过期时间为120秒
        return chineseCaptcha.toBase64();
    }

    /**
     * 生成算术验证码
     * @param key 缓存的key
     * @return 验证码图片的base64编码
     */
    public String getArithmeticCaptcha(String key) {
        ArithmeticCaptcha arithmeticCaptcha = new ArithmeticCaptcha(130, 48);
        arithmeticCaptcha.setLen(3); // 几位数运算，默认是两位
        String code = arithmeticCaptcha.text(); // 获取计算结果
        log.info("验证码: {}", code);
        redisManager.set(key, code, 120); // 将验证码存入Redis，设置过期时间为120秒
        return arithmeticCaptcha.toBase64();
    }

    /**
     * 验证用户输入的验证码是否正确
     * @param key 缓存的key
     * @param userInput 用户输入的验证码
     * @return 验证结果
     */
    public boolean validateCaptcha(String key, String userInput) {
        String cachedCode = (String) redisManager.get(key);
        if (cachedCode == null) {
            throw new BusinessException(ErrorCode.CAPTCHA_EXPIRED);
        }
        return cachedCode.equalsIgnoreCase(userInput); // 忽略大小写比较
    }

    /**
     * 清除Redis中的验证码
     * @param key 缓存的key
     */
    public void clearCaptcha(String key) {
        redisManager.delete(key);
    }
}
